/*
*/

#include "keypad.h"

#include "display.h"
#include "event.h"
#include "timer.h"

#define	KEY_MASK	0x07e0

u32 KeypadEvent(void){
    static u32	o,t=CLK_NIL;
    const u8 keymap[8][6]={
	{KEY_RESV,KEY_RESV,KEY___TV,KEY____1,KEY____2,KEY____3},
	{KEY_CABL,KEY____4,KEY____5,KEY____6,KEY__DVD,KEY____7},
	{KEY____8,KEY____9,KEY__AUX,KEY_DIGI,KEY____0,KEY_DISP},
	{KEY_MENU,KEY_UPPP,KEY_EXIT,KEY_LEFT,KEY_OKEY,KEY_RGHT},
	{KEY_INFO,KEY_DOWN,KEY_ENTR,KEY_STTL,KEY_ANGL,KEY_ZOOM},
	{KEY_LANG,KEY_PWER,KEY_RECR,KEY_STOP,KEY_EJCT,KEY_BKWD},
	{KEY_PLAY,KEY_FRWD,KEY_VOLI,KEY_RESV,KEY_CHLI,KEY_BACK},
	{KEY_MUTE,KEY_CHLD,KEY_VOLD,KEY_RESV,KEY_PROG,KEY_STAR}
    };
    u8	c,r;
    u16 k,s;

    GPIO_Write(GPIOB,0xf000);	//Turn off all LEDs
    k=GPIO_ReadInputData(GPIOA)&KEY_MASK;
    if(k!=KEY_MASK){
	if(!o){
	    if(t==CLK_NIL)
		t=(clock+16)&CLK_MASK;
	    else if(clock>t){
		s=4;
		for(r=0;r<8;r++){
		    GPIO_Write(GPIOB,(~s)&0xfffc);
		    k=GPIO_ReadInputData(GPIOA)&KEY_MASK;
		    if(k!=KEY_MASK){
			k>>=5;
			for(c=0;c<6;c++){
			    if(!(k&1)){
				o=keymap[r][c];
				t=CLK_NIL;
				return (o<<16)+EVN_KEYPRESS;
			    }
			    k>>=1;
			}
		    }
		    s<<=1;
		}
		o=255;
		t=CLK_NIL;
	    }
	}
    }
    else if(o){
	if(t==CLK_NIL)
	    t=(clock+16)&CLK_MASK;
	else if(clock>t){
	    t=CLK_NIL;
	    o=0;
	    return EVN_KEYRELEASE;
	}
    }
    return 0;
}
